package com.gec.system.util;

import io.jsonwebtoken.*;
import org.springframework.util.StringUtils;

import java.util.Date;


/**
 *
 *
 *
 *   生成JSON Web令牌的工具类
 */
public class JwtHelper {

    //token过期时间
    private static long tokenExpiration = 365 * 24 * 60 * 60 * 1000;
    //加密秘钥
    private static String tokenSignKey = "123456";

    //根据用户id和用户名称生成token字符串
    public static String createToken(String userId, String username) {
        String token = Jwts.builder()

                // .setHeader(new HashMap<>().put("alg","","typ","jwt"))

                // jwt 三部分 （头部、载荷 、签名）

                // 第二部分 设置载荷
                // 用户名称
                .setSubject("DAFEI-USER")
                // token过期时间
                .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))
                .claim("userId", userId)
                // 设置用户 username
                .claim("username", username)

                // 第三部分  秘钥
                .signWith(SignatureAlgorithm.HS512, tokenSignKey)

                .compressWith(CompressionCodecs.GZIP)

                // 拼接 操作  组成三部分 按照 . 分隔
                .compact();
        return token;
    }

    //从token字符串获取userid （校验token 是否合法)
    // userid  username
    public static String getUserId(String token) {
        try {
            if (StringUtils.isEmpty(token)) return null;

            Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
            Claims claims = claimsJws.getBody();
            String userId = (String) claims.get("userId");
            return userId;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    //从token字符串获取username
    public static String getUsername(String token) {
        try {
            if (StringUtils.isEmpty(token)) return "";

            Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
            Claims claims = claimsJws.getBody();
            return (String) claims.get("username");
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}